#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Software: PyCharm
# @Version : Python-
# @Author  : Shengji He
# @Email   : hsjbit@163.com
# @File    : FindCommonCharacters.py
# @Time    : 2020/10/14 10:10
# @Description:
from typing import List
from collections import Counter
from functools import reduce


class Solution:
    def commonChars(self, A: List[str]) -> List[str]:
        return list(reduce(lambda x, y: x & y, map(Counter, A)).elements())

    def commonChars(self, A: List[str]) -> List[str]:
        """
        Given an array A of strings made only from lowercase letters, return a list of all characters that
        show up in all strings within the list (including duplicates).  For example, if a character occurs 3 times
        in all strings but not 4 times, you need to include that character three times in the final answer.
        
        You may return the answer in any order.

        Example 1:
            Input: ["bella","label","roller"]
            Output: ["e","l","l"]
        Example 2:
            Input: ["cool","lock","cook"]
            Output: ["c","o"]

        Note:
            - 1 <= A.length <= 100
            - 1 <= A[i].length <= 100
            - A[i][j] is a lowercase letter

        :param A:
        :return:
        """
        minfreq = [float('inf')] * 26
        for word in A:
            freq = [0] * 26
            for ch in word:
                freq[ord(ch) - ord('a')] += 1
            for i in range(26):
                minfreq[i] = min(minfreq[i], freq[i])

        ans = list()
        for i in range(26):
            ans.extend([chr(i + ord('a'))] * minfreq[i])
        return ans


if __name__ == '__main__':
    S = Solution()
    A = ["bella", "label", "roller"]
    print(S.commonChars(A))
    print('done')
